// 日志工厂很简单，只是一个包装在 console.log 上的 wrapper
// 这样你就可以使用相同的 API，在同一时间实现以下功能
// 1. 隐藏所有生产日志
// 2. 扩展它以将日志保存到本地存储 / 或发送回你的后端（用于调试或分析）

interface Logger {
  (...args: any[]): void,
  log: (...args: any[]) => void,
  info: (...args: any[]) => void,
  warn: (...args: any[]) => void,
  error: (...args: any[]) => void
}

// 日志工厂
export function logFactory(enabled: Boolean): Logger {
  let isEnabled = !!enabled

  const obj = ['log', 'info', 'warn', 'error'].reduce((prev: any, method: string) => {
    prev[method] = (...args: any[]) => {
      if (!isEnabled) return

      (console[method as keyof Console] as Function)(
        (new Date()).toISOString(),
        ' - ',
        ...args
      )
    }
    return prev
  }, {})

  return (<any>Object).assign(obj.log, obj, {
    enable: () => { isEnabled = true },
    disable: () => { isEnabled = false }
  })
}

const logger: Logger = logFactory(
  import.meta.env.NODE_ENV !== 'production'
)

export default logger
